package com.sky.controller.admin;


import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;


@Slf4j
@Api(tags = "菜品相关接口")
@RestController("adminDishController")
@RequestMapping("/admin/dish")
public class DishController {

    @Autowired
    private DishService dishService;

    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 新增菜品
     *
     * @param dto
     * @return
     */
    @ApiOperation("新增菜品接口")
    @PostMapping               // 只能使用dto进接受, dish没有口味列表字段
    public Result<String> addDish(@RequestBody DishDTO dto) {
        //1.关键入口, 输入日志
        log.info("新增菜品:dto={}", dto);
        //2.调用service层,进行逻辑处理
        dishService.addDish(dto);

       /* //缓存优化--清理缓存
        // delete 就是一个通用的, 根据key删除
        redisTemplate.delete("dish_" + dto.getCategoryId());*/
        cleanCache();
        //3.响应结果
        return Result.success();
    }

    /**
     * 菜品分页查询
     *
     * @param dto
     * @return
     */
    @ApiOperation("菜品分页查询")
    @GetMapping("/page")
    public Result<PageResult> pageQuery(DishPageQueryDTO dto) {
        //1.关键入口,输出日志
        log.info("菜品分页查询:dto={}", dto);
        //2.调用service层进行逻辑处理
        PageResult pageResult = dishService.pageQuery(dto);
        //3.返回结果
        return Result.success(pageResult);
    }


    /**
     * 删除菜品
     *
     * @param ids
     * @return
     */
    @ApiOperation("删除菜品")
    @DeleteMapping
    public Result<String> delete(@RequestParam List<Long> ids) {
        //1.入口输出日志
        log.info("删除菜品:ids={}", ids);
        //2.调用service层进行逻辑处理
        dishService.delete(ids);

        //全部删除的原因: 删除操作,是可能批量可能多条, 涉及多个categoryId, 不可能逐条删除过于麻烦
        //缓存优化-清理缓存-将菜品缓存全部删除
        //没有使用序列化器, 就是用下面的全部缓存
        cleanCache();

        //3.返回结果
        return Result.success();
    }

    /**
     * 根据id查询菜品(查询回显)
     *
     * @param id
     * @return
     */
    @ApiOperation("根据id查询菜品")
    @GetMapping("{id}")
    public Result<DishVO> getDishById(@PathVariable Long id) {
        //1.入口输出日志
        log.info("根据id查询菜品:id={}", id);
        //2.调用service进行业务处理, 并获取数据
        DishVO dishVO = dishService.getDishById(id);
        //3.响应结果
        return Result.success(dishVO);
    }

    @ApiOperation("修改菜品")
    @PutMapping
    public Result<String> updateDish(@RequestBody DishDTO dto) {
        //1.关键点,输出日志
        log.info("修改菜品:dto={}", dto);
        //2.调用Service,进行输出处理
        dishService.updateDish(dto);
        cleanCache();
        //3.响应结果
        return Result.success();
    }

    private void cleanCache() {
        //缓存优化-清理缓存-将菜品缓存全部删除
        //没有使用序列化器, 就是用下面的全部缓存
        Set keys = redisTemplate.keys("*dish_*");
        redisTemplate.delete(keys);
    }

    /**
     * 菜品起售与停售
     *
     * @param status
     * @param id
     * @return
     */

    @ApiOperation("菜品起售、停售")
    @PostMapping("/status/{status}")
    public Result<String> enableOrDisable(@PathVariable Integer status, Long id) {
        //1.入口,输出日志信息
        log.info("菜品起售停售:status={},id={}", status, id);
        //2.调用service记性逻辑处理, 并做修改操作
        dishService.enableOrDisable(status, id);

        //重新起售之后, 要让前端查看到菜品, 也需要缓存优化
        //缓存优化-清理缓存-将菜品缓存全部删除
        //没有使用序列化器, 就是用下面的全部缓存
        cleanCache();
        //3.响应结果
        return Result.success();
    }

    /**
     * 根据分类id查询菜品
     * @param categoryId
     * @return
     */

    @ApiOperation("根据分类id查询菜品")
    @GetMapping("/list")
    public Result<List<Dish>> getById(Long categoryId) {
        //1.关键入口, 输出日志
        log.info("根据分类id查询菜品:categoryId={}", categoryId);
        //2.调用service层进行逻辑处理, 并获取结果(是一个集合)
        List<Dish> dishList = dishService.getById(categoryId);
        //3.响应结果
        return Result.success(dishList);
    }
}
